/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import pe.com.cotelasa.scp.controlador.backingBean.BKDetallePedidoFP;
import pe.com.cotelasa.scp.controlador.backingBean.BKFacturaProforma;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCotizacion;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoUnidadMinima;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.Cotizacion;
import pe.com.cotelasa.scp.entidad.DetallePedidoFp;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@Named(value = "MBDetallePedidoFP")
@Scope("request")
public class MBDetallePedidoFP extends MBGenerico implements Serializable {

    @Inject
    private BKDetallePedidoFP bKDetallePedidoFP;
    @Inject
    private BKFacturaProforma bkFacturaProforma;
    @Inject
    private IServicioCotizacion servicioCotizacion;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Inject
    private IServicioTipoUnidadMinima servicioTipoUnidadMinima;
    @Autowired
    BKSession session;

    public void nuevoDetalle() {
        this.bKDetallePedidoFP.setFormularioDetalleFacturaProforma(new DetallePedidoFp());
        this.bKDetallePedidoFP.setArticuloFormulario(new Articulo(0));
        this.bKDetallePedidoFP.setListaCotizacionActivo(null);
        this.bKDetallePedidoFP.setCodigoCotizacion("");
        try {
            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(servicioCategoriaArticulo.obtenerCategoriaArticuloPorNombre("TELA"));
            bkFacturaProforma.setListaArticulosActivos(servicioCotizacion.listarArticulosCotizados(articulo, session.getEmpresa().getId()));
            
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }

    }

    public void nuevoDetallePrenda() {
        this.bKDetallePedidoFP.setFormularioDetalleFacturaProforma(new DetallePedidoFp());
        this.bKDetallePedidoFP.setArticuloFormulario(new Articulo(0));
        this.bKDetallePedidoFP.setListaCotizacionActivo(null);
        this.bKDetallePedidoFP.setCodigoCotizacion("");
        try {
            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(servicioCategoriaArticulo.obtenerCategoriaArticuloPorNombre("PRENDA"));
            bkFacturaProforma.setListaArticulosActivos(servicioCotizacion.listarArticulosCotizados(articulo, session.getEmpresa().getId()));
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }

    }

    public void eliminarDetallePedidoFp(ActionEvent actionEvent) {
        DetallePedidoFp detalleEliminado = this.bKDetallePedidoFP.getCurrentDetalleFacturaProforma();
        if (detalleEliminado.getId() == null) {

            Iterator itr = this.bKDetallePedidoFP.getListaDetallePedidoFP().iterator();
            while (itr.hasNext()) {
                DetallePedidoFp deta = (DetallePedidoFp) itr.next();
                if (detalleEliminado.getIdCotizacion().equals(deta.getIdCotizacion())) {
                    itr.remove();
                    break;
                }
            }
        } else {

            Integer index = this.bKDetallePedidoFP.getListaDetallePedidoFP().indexOf(detalleEliminado);

            this.bKDetallePedidoFP.getListaDetallePedidoFP().remove(detalleEliminado);
            detalleEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            detalleEliminado.setFecModificacion(new Date());
            detalleEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().set(index, detalleEliminado);
        }
        sumarDetallesPedidoFP();

    }

    public void eliminarDetallePedidoFpPrenda(ActionEvent actionEvent) {
        DetallePedidoFp detalleEliminado = this.bKDetallePedidoFP.getCurrentDetalleFacturaProforma();
        if (detalleEliminado.getId() == null) {

            Iterator itr = this.bKDetallePedidoFP.getListaDetallePedidoFP().iterator();
            while (itr.hasNext()) {
                DetallePedidoFp deta = (DetallePedidoFp) itr.next();
                if (detalleEliminado.getIdCotizacion().equals(deta.getIdCotizacion())) {
                    itr.remove();
                    break;
                }
            }
        } else {

            Integer index = this.bKDetallePedidoFP.getListaDetallePedidoFP().indexOf(detalleEliminado);

            this.bKDetallePedidoFP.getListaDetallePedidoFP().remove(detalleEliminado);
            detalleEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            detalleEliminado.setFecModificacion(new Date());
            detalleEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().set(index, detalleEliminado);
        }
        sumarDetallesPedidoFPPrenda();

    }

    public void agregarDetallePedidoFp(ActionEvent actionEvent) {
        BigDecimal compra = bkFacturaProforma.getFacturaProformaFormulario().getCambioCompra();
        DetallePedidoFp detalleAgregado = this.bKDetallePedidoFP.getFormularioDetalleFacturaProforma();
        detalleAgregado.setUsrCreacion(session.getUsuario().getUsuario());
        detalleAgregado.setFecCreacion(new Date());
        detalleAgregado.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());

        //detalleAgregado.setPesoTotal(detalleAgregado.getPesoUnitario().multiply(detalleAgregado.getCantidadUV()));

        detalleAgregado.setPesoUnitario(BigDecimal.ZERO);
        detalleAgregado.setPesoTotal(BigDecimal.ZERO);
        detalleAgregado.setPrecioUnitarioSoles(detalleAgregado.getPrecioUnitario().multiply(compra));
        detalleAgregado.setCantidadUM(detalleAgregado.getProporcionUvUm().multiply(detalleAgregado.getCantidadUV()));
        detalleAgregado.setPrecioTotal(detalleAgregado.getPrecioUnitario().multiply(detalleAgregado.getCantidadUM()));
        detalleAgregado.setPrecioTotalSoles(detalleAgregado.getPrecioUnitarioSoles().multiply(detalleAgregado.getCantidadUM()));

        this.bKDetallePedidoFP.setFormularioDetalleFacturaProforma(new DetallePedidoFp());
        this.bKDetallePedidoFP.getListaDetallePedidoFP().add(detalleAgregado);
        this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().add(detalleAgregado);

        sumarDetallesPedidoFP();

    }

    public void agregarDetallePedidoFpPrenda(ActionEvent actionEvent) {
        BigDecimal compra = bkFacturaProforma.getFacturaProformaFormulario().getCambioCompra();
        DetallePedidoFp detalleAgregado = this.bKDetallePedidoFP.getFormularioDetalleFacturaProforma();
        detalleAgregado.setUsrCreacion(session.getUsuario().getUsuario());
        detalleAgregado.setFecCreacion(new Date());
        detalleAgregado.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());

        detalleAgregado.setPrecioUnitarioSoles(detalleAgregado.getPrecioUnitario().multiply(compra));
        //detalleAgregado.setCantidadUM(detalleAgregado.getProporcionUvUm().multiply(detalleAgregado.getCantidadUV()));
        detalleAgregado.setPesoUnitario(BigDecimal.ZERO);
        detalleAgregado.setPesoTotal(BigDecimal.ZERO);
        detalleAgregado.setPrecioTotal(detalleAgregado.getPrecioUnitario().multiply(detalleAgregado.getCantidadUM()));
        detalleAgregado.setPrecioTotalSoles(detalleAgregado.getPrecioUnitarioSoles().multiply(detalleAgregado.getCantidadUM()));

        this.bKDetallePedidoFP.setFormularioDetalleFacturaProforma(new DetallePedidoFp());
        this.bKDetallePedidoFP.getListaDetallePedidoFP().add(detalleAgregado);
        this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().add(detalleAgregado);

        sumarDetallesPedidoFPPrenda();

    }

    public void editarDetallePedidoFp(RowEditEvent event) {
        BigDecimal compra = bkFacturaProforma.getFacturaProformaFormulario().getCambioCompra();

        DetallePedidoFp detalleEditado = (DetallePedidoFp) event.getObject();
        Integer index = this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().indexOf(detalleEditado);
        if (detalleEditado.getId() != null) {

            detalleEditado.setUsrModificacion(session.getUsuario().getUsuario());
            detalleEditado.setFecModificacion(new Date());
        }
        //detalleEditado.setPesoTotal(detalleEditado.getPesoUnitario().multiply(detalleEditado.getCantidadUV()));
        if (bkFacturaProforma.getFacturaProformaFormulario().getIdTipoMoneda().getId() == Constantes.TipoMoneda.DOLARES) {
            detalleEditado.setPrecioUnitarioSoles(detalleEditado.getPrecioUnitario().multiply(compra));
        } else {
            detalleEditado.setPrecioUnitario(detalleEditado.getPrecioUnitario().divide(compra, MathContext.DECIMAL32));
        }

        detalleEditado.setCantidadUM(detalleEditado.getProporcionUvUm().multiply(detalleEditado.getCantidadUV()));

        detalleEditado.setPrecioTotal(detalleEditado.getPrecioUnitario().multiply(detalleEditado.getCantidadUM()));
        detalleEditado.setPrecioTotalSoles(detalleEditado.getPrecioUnitarioSoles().multiply(detalleEditado.getCantidadUM()));
        this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().set(index, detalleEditado);

        sumarDetallesPedidoFP();
    }

    public void editarDetallePedidoFpPrenda(RowEditEvent event) {
        BigDecimal compra = bkFacturaProforma.getFacturaProformaFormulario().getCambioCompra();

        DetallePedidoFp detalleEditado = (DetallePedidoFp) event.getObject();
        Integer index = this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().indexOf(detalleEditado);
        if (detalleEditado.getId() != null) {

            detalleEditado.setUsrModificacion(session.getUsuario().getUsuario());
            detalleEditado.setFecModificacion(new Date());
        }
        if (bkFacturaProforma.getFacturaProformaFormulario().getIdTipoMoneda().getId() == Constantes.TipoMoneda.DOLARES) {
            detalleEditado.setPrecioUnitarioSoles(detalleEditado.getPrecioUnitario().multiply(compra));
        } else {
            detalleEditado.setPrecioUnitario(detalleEditado.getPrecioUnitario().divide(compra, MathContext.DECIMAL32));
        }

        //detalleEditado.setPrecioUnitarioSoles(detalleEditado.getPrecioUnitario().multiply(compra));
        //detalleAgregado.setCantidadUM(detalleAgregado.getProporcionUvUm().multiply(detalleAgregado.getCantidadUV()));

        //detalleEditado.setPesoTotal(detalleEditado.getPesoUnitario().multiply(detalleEditado.getCantidadUM()));
        detalleEditado.setPrecioTotal(detalleEditado.getPrecioUnitario().multiply(detalleEditado.getCantidadUM()));
        detalleEditado.setPrecioTotalSoles(detalleEditado.getPrecioUnitarioSoles().multiply(detalleEditado.getCantidadUM()));

        this.bKDetallePedidoFP.getListaDetallePedidoFPEditar().set(index, detalleEditado);

        sumarDetallesPedidoFPPrenda();
    }

    public void sumarDetallesPedidoFP() {
        BigDecimal cantProductos = BigDecimal.ZERO;
        BigDecimal pesoTotal = BigDecimal.ZERO;
        BigDecimal montoTotal = BigDecimal.ZERO;
        BigDecimal montoTotalSoles = BigDecimal.ZERO;
        Iterator it = this.bKDetallePedidoFP.getListaDetallePedidoFP().iterator();
        while (it.hasNext()) {
            DetallePedidoFp aux = (DetallePedidoFp) (it.next());
            cantProductos = cantProductos.add(aux.getCantidadUV());
            pesoTotal = pesoTotal.add(aux.getCantidadUM());
            montoTotal = montoTotal.add(aux.getPrecioTotal());
            montoTotalSoles = montoTotal.add(aux.getPrecioTotalSoles());
        }

        bkFacturaProforma.getFacturaProformaFormulario().setCantidadTotalProductos(cantProductos);
        bkFacturaProforma.getFacturaProformaFormulario().setMontoTotal(montoTotal);
        bkFacturaProforma.getFacturaProformaFormulario().setMontoTotalSoles(montoTotalSoles);
        bkFacturaProforma.getFacturaProformaFormulario().setPesoTotal(pesoTotal);
    }

    public void sumarDetallesPedidoFPPrenda() {
        BigDecimal cantProductos = BigDecimal.ZERO;
        BigDecimal pesoTotal = BigDecimal.ZERO;
        BigDecimal montoTotal = BigDecimal.ZERO;
        BigDecimal montoTotalSoles = BigDecimal.ZERO;
        Iterator it = this.bKDetallePedidoFP.getListaDetallePedidoFP().iterator();
        while (it.hasNext()) {
            DetallePedidoFp aux = (DetallePedidoFp) (it.next());
            cantProductos = cantProductos.add(aux.getCantidadUM());
            pesoTotal = pesoTotal.add(aux.getPesoTotal());
            montoTotal = montoTotal.add(aux.getPrecioTotal());
            montoTotalSoles = montoTotal.add(aux.getPrecioTotalSoles());
        }

        bkFacturaProforma.getFacturaProformaFormulario().setCantidadTotalProductos(cantProductos);
        bkFacturaProforma.getFacturaProformaFormulario().setMontoTotal(montoTotal);
        bkFacturaProforma.getFacturaProformaFormulario().setMontoTotalSoles(montoTotalSoles);
        bkFacturaProforma.getFacturaProformaFormulario().setPesoTotal(pesoTotal);
    }

    public void cargarCotizaciones() {

        Cotizacion cotiza = new Cotizacion();
        if (this.bKDetallePedidoFP.getArticuloFormulario().getId() != 0) {
            try {
                cotiza.setIdArticulo(servicioArticulo.conseguirArticuloPorId(this.bKDetallePedidoFP.getArticuloFormulario().getId()));
                cotiza.setIdEmpresa(session.getEmpresa());
                this.bKDetallePedidoFP.setListaCotizacionActivo(servicioCotizacion.listarUltimasVersionesCotizacion(cotiza));
                if (this.bKDetallePedidoFP.getListaCotizacionActivo().isEmpty()) {
                    mostrarError("No se ha registrado cotizacion para este producto.");
                }

            } catch (ServiceException e) {
                mostrarError("Ocurrio un error al cargar la informacion.");
            }

        }

    }

    public void elegirCotizacion() {

        try {
            DetallePedidoFp detalle = new DetallePedidoFp();
            Cotizacion cotizacion = new Cotizacion();
            cotizacion.setCodigo(this.bKDetallePedidoFP.getCodigoCotizacion());
            cotizacion.setTipoCot(bkFacturaProforma.getFacturaProformaFormulario().getTipoFP());
            cotizacion.setIdEmpresa(session.getEmpresa());
            cotizacion = servicioCotizacion.conseguirCotizaionPorCodigo(cotizacion);
            if (cotizacion != null) {
                detalle.setNombreProducto(cotizacion.getNombreProducto());
                detalle.setIdCotizacion(cotizacion);
                detalle.setDetalle(cotizacion.getDetalle());
                detalle.setPrecioUnitario(cotizacion.getPrecioVenta());
                detalle.setUnidadMedida(cotizacion.getUnidadMedida());
                this.bKDetallePedidoFP.setFormularioDetalleFacturaProforma(detalle);
            } else {
                mostrarError("Ese Código No Existe para esta Área");
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void ponerPeso() {
        this.bKDetallePedidoFP.getFormularioDetalleFacturaProforma().setPesoUnitario(
                this.bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getProporcionUvUm());
    }

    public void compararUnidadMedida() {
        if (!bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getUnidadMedida().equalsIgnoreCase(bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getIdCotizacion().getUnidadMedida())) {
            bKDetallePedidoFP.setActivarConversion(true);

        } else {
            bKDetallePedidoFP.setActivarConversion(false);
            bKDetallePedidoFP.getFormularioDetalleFacturaProforma().setConversion(null);
        }
    }

    public void convertir() {
        System.out.println("conversion: " + bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getConversion());
        if (bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getConversion() != null && bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getConversion().floatValue() > 0) {
            System.out.println("entro 1");
            bKDetallePedidoFP.getFormularioDetalleFacturaProforma().setPrecioUnitario(
                    bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getIdCotizacion().getPrecioVenta().divide(
                    bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getConversion(), MathContext.DECIMAL32));

        } else {
            System.out.println("entro 2");
            bKDetallePedidoFP.getFormularioDetalleFacturaProforma().setPrecioUnitario(bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getIdCotizacion().getPrecioVenta());
        }
        System.out.println("precio unitario: " + bKDetallePedidoFP.getFormularioDetalleFacturaProforma().getPrecioUnitario());
    }
}
